//var 可以变量提升
// a = 1;
// // console.log(a);
// var a = 2;
// //let 不能变量提升 块级作用域
// // b=5;
// // // console.log(b);
// // let b; 
// //const 声明常量 且常量不能修改，必须初始化，存在块级作用域
// const c = 1;
// console.log(c);

// {
//     let a = 10;
//     var b = 1;
//     // console.log(a);//10  let 只在作用域内有效
//     // console.log(b); var 全局作用域
// }
// console.log(a);//报错
// console.log(b);//1

// for(let a = 0;a<10;a++){
//     // console.log(a);1-9
// }
// console.log(a);//报错

// for(var a=0;a<10;a++){
//     // console.log(a);1-9
// }
// console.log(a);//9+1 = 10

var a = [];
for(var i=0;i<10;i++){
    a[i]=function(){
        console.log(i);
    }
}
a[6]()
// 上面代码中，变量i是var命令声明的，在全局范围内都有效，所以全局只有一个变量i。
// 每一次循环，变量i的值都会发生改变，而循环内被赋给数组a的函数内部的console.log(i)，
// 里面的i指向的就是全局的i。也就是说，所有数组a的成员里面的i，指向的都是同一个i，
// 导致运行时输出的是最后一轮的i的值，也就是 10。

var  c = [];
for(let d=0;d<10;d++){
   c[d]=function(){
       console.log(d);
   }
}
c[6]();
// 上面代码中，变量d是let声明的，当前的i只在本轮循环有效，
// 所以每一次循环的d其实都是一个新的变量，所以最后输出的是6。
// 你可能会问，如果每一轮循环的变量i都是重新声明的，那它怎么知道上一轮循环的值，
// 从而计算出本轮循环的值？这是因为 JavaScript 引擎内部会记住上一轮循环的值，
// 初始化本轮的变量i时，就在上一轮循环的基础上进行计算。
